package com.java.basis.sort;

import java.util.Arrays;

/**
 * 双边循环快排
 *
 */
public class QuickSort2 {
    public static void main(String[] args) {
        int[] a = {5, 3, 7, 2, 9, 8, 1, 4};
//        partition(a, 0, a.length - 1);
        quick(a, 0, a.length - 1);

    }

    public static void quick(int[] a, int l, int h) {
        if (l >= h) {
            return;
        }
        int p = partition(a, l, h);//p 索引值
        quick(a, l, p - 1);// 左边分区的范围确定
        quick(a, p + 1, h);// 右边分区的范围确定
    }

    private static int partition(int[] a, int l, int h) {
        int pv = a[l];// 基准点元素
        int i = l;
        int j = h;
        while (i < j) {
            // 在双边查找的时候，必须是先从右向左找比基准点小的
            // j 从右向左，找比基准点小的
            while (i < j && a[j] > pv) {
                j--;
            }
            // i 从左向右，找比基准点大的
            while (i < j && a[i] <= pv) {// 这里为什么要<=？主要是为了把基准点跳过去
                i++;
            }
            BubbleSort.swap(a, i, j);
        }
        BubbleSort.swap(a, l, i);
        System.out.println(Arrays.toString(a) + " j=" + j);

        //返回值代表的是基准点元素所在的正确索引，用它确定下一轮分区的边界
        return i;
    }
}
